package com.github.cyf.common.module;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author chenyifan
 * @create 2024-05-03 10:21
 */
public class Rs extends LinkedHashMap<String, Object> implements Serializable {

    // 序列化版本号
    private static final long serialVersionUID = 1L;

    // 预定的状态码
    public static final String CODE_SUCCESS = "200";
    public static final String CODE_ERROR = "500";

    public Rs() {
    }

    /**
     * 构建
     * @param code 状态码
     * @param msg 信息
     * @param data 数据
     */
    public Rs(String code, String msg, Object data) {
        this.setCode(code);
        this.setMsg(msg);
        this.setData(data);
    }

    /**
     * 根据 Map 快速构建
     * @param map /
     */
    public Rs(Map<String, ?> map) {
        this.setMap(map);
    }

    /**
     * 获取code
     * @return code
     */
    public String getCode() {
        return (String) this.get("code");
    }
    /**
     * 获取msg
     * @return msg
     */
    public String getMsg() {
        return (String)this.get("msg");
    }
    /**
     * 获取data
     * @return data
     */
    public Object getData() {
        return this.get("data");
    }

    /**
     * 给code赋值，连缀风格
     * @param code code
     * @return 对象自身
     */
    public Rs setCode(String code) {
        this.put("code", code);
        return this;
    }

    /**
     * 给msg赋值，连缀风格
     * @param msg msg
     * @return 对象自身
     */
    public Rs setMsg(String msg) {
        this.put("msg", msg);
        return this;
    }

    /**
     * 给data赋值，连缀风格
     * @param data data
     * @return 对象自身
     */
    public Rs setData(Object data) {
        this.put("data", data);
        return this;
    }

    /**
     * 写入一个值 自定义key, 连缀风格
     * @param key key
     * @param data data
     * @return 对象自身
     */
    public Rs set(String key, Object data) {
        this.put(key, data);
        return this;
    }

    /**
     * 写入一个Map, 连缀风格
     * @param map map
     * @return 对象自身
     */
    public Rs setMap(Map<String, ?> map) {
        for (String key : map.keySet()) {
            this.put(key, map.get(key));
        }
        return this;
    }


    // ============================  静态方法快速构建  ==================================

    // 构建成功
    public static Rs ok() {
        return new Rs(CODE_SUCCESS, "ok", null);
    }
    public static Rs ok(String msg) {
        return new Rs(CODE_SUCCESS, msg, null);
    }
    public static Rs data(Object data) {
        return new Rs(CODE_SUCCESS, "ok", data);
    }

    // 构建失败
    public static Rs error() {
        return new Rs(CODE_ERROR, "error", null);
    }
    public static Rs error(String msg) {
        return new Rs(CODE_ERROR, msg, null);
    }


    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append("{\n");
        for (Map.Entry<String, Object> entry : entrySet()) {
            builder.append("\"").append(entry.getKey()).append("\"").append(": ").append(transValue(entry.getValue())).append(", ").append("\n");
        }
        builder.delete(builder.length() - 3, builder.length());
        builder.append("\n}");
        return builder.toString();
    }

    /**
     * 转换 value 值：
     * 	如果 value 值属于 String 类型，则在前后补上引号
     * 	如果 value 值属于其它类型，则原样返回
     *
     * @param value 具体要操作的值
     * @return 转换后的值
     */
    private String transValue(Object value) {
        if(value == null) {
            return null;
        }
        if(value instanceof String) {
            return "\"" + value + "\"";
        }
        return String.valueOf(value);
    }

}
